#include "DRV_Gpio.h"

void gpio_port_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,  ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,  ENABLE);
    
    /******************* 输出端口配置 ********************/
    /*
        1.PA11 - NFC复位引脚
    */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, GPIO_Pin_11);

    /*
        1.PB3 - 漏电流测试口
        2.PB4 - 蓝牙唤醒端口
        3.PB6 - 蜂鸣器端口
        3.PB7 - 蓝牙复位端口
        4.PB8 - 漏电流校准端口
        5.PB9 - 4G模块复位端口
    */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,   GPIO_Pin_7);
    GPIO_ResetBits(GPIOB, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_8|GPIO_Pin_9);
    
    
    /* 
        1. PC4 - 短路检测控制
        2. PC5 - 主正继电器控制
        3. PC13- 4G模块电源控制
    */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_13);
      
    /******************* 输入端口配置 ********************/
    /*
        1.PA0 - 漏电故障反馈
        2.PA1 - 蓝牙连接状态反馈
        3.PA8 - 火线故障检测
    */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);    

    /*
        1.PC7 - 零线故障检测
    */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);  
    
}

/**
  * @brief  串口初始化
  * @param  baud-波特率
  * @retval None
  */
void ec800_gpio_config(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,  ENABLE);   //使能GPIOC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,  ENABLE);   //使能GPIOB
    
    /* PC13*/
	GPIO_InitStructure.GPIO_Pin   = EC4G_PWRKEY_PIN;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;       //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	    //速度50MHz
	GPIO_Init(EC4G_PWRKEY_PORT, &GPIO_InitStructure);
    
    /* PB9 */
	GPIO_InitStructure.GPIO_Pin   = EC4G_RESET_PIN;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;       //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	    //速度50MHz
	GPIO_Init(EC4G_RESET_PORT, &GPIO_InitStructure);    
}


/*******************************************************************************
* Function Name  : e4g_power_set
* Description    : 4G模块电源控制脚
* Input          : val=1 输出高电平
                   val=0 输出低电平
* Output         : None
* Return         : None
*******************************************************************************/
void e4g_power_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(E4G_POWER_PORT,   E4G_POWER_PIN);
    }
    else
    {
        GPIO_ResetBits(E4G_POWER_PORT, E4G_POWER_PIN);
    }   
}

//应该放到各自模块去，后续优化。wangtao
/*******************************************************************************
* Function Name  : e4g_reset_set
* Description    : 4G模块复位引脚
* Input          : val=1 输出高电平
                   val=0 输出低电平
* Output         : None
* Return         : None
*******************************************************************************/
void e4g_reset_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(E4G_RESET_PORT, E4G_RESET_PIN);
    }
    else
    {
        GPIO_ResetBits(E4G_RESET_PORT, E4G_RESET_PIN);
    }   
}

void rcd_test_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(RCD_TEST_PORT, RCD_TEST_PIN);
    }
    else
    {
        GPIO_ResetBits(RCD_TEST_PORT, RCD_TEST_PIN);
    }   
}

void rcd_cal_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(RCD_CAL_PORT, RCD_CAL_PIN);
    }
    else
    {
        GPIO_ResetBits(RCD_CAL_PORT, RCD_CAL_PIN);
    }   
}

void short_circuit_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(SHORT_CIRCUIT_PORT, SHORT_CIRCUIT_PIN);
    }
    else
    {
        GPIO_ResetBits(SHORT_CIRCUIT_PORT, SHORT_CIRCUIT_PIN);
    }      
}

void ac_relay_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(AC_RELAY_PORT, AC_RELAY_PIN);
    }
    else
    {
        GPIO_ResetBits(AC_RELAY_PORT, AC_RELAY_PIN);
    }      
}

void ble_wakeup_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(BLE_WAKEUP_PORT, BLE_WAKEUP_PIN);
    }
    else
    {
        GPIO_ResetBits(BLE_WAKEUP_PORT, BLE_WAKEUP_PIN);
    }      
}

void ble_reset_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(BLE_RESET_PORT, BLE_RESET_PIN);
    }
    else
    {
        GPIO_ResetBits(BLE_RESET_PORT, BLE_RESET_PIN);
    }      
}

void nfc_reset_pin_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(NFC_RESET_PORT, NFC_RESET_PIN);
    }
    else
    {
        GPIO_ResetBits(NFC_RESET_PORT, NFC_RESET_PIN);
    }
}

/* 漏电流 */
uint8_t rcd_trip_read(void)
{
    GPIO_ReadInputDataBit(RCD_TRIP_PORT, RCD_TRIP_PIN);
    return 0;
}

/* 蓝牙连接状态 */
uint8_t ble_connt_read(void)
{
    GPIO_ReadInputDataBit(BLE_CONNT_PORT, BLE_CONNT_PIN);
    return 0;
}

uint8_t k1_fault_read(void)
{
    GPIO_ReadInputDataBit(K1_FAULT_PORT, K1_FAULT_PIN);
    return 0;
}

uint8_t k2_fault_read(void)
{
    GPIO_ReadInputDataBit(K2_FAULT_PORT, K2_FAULT_PIN);
    return 0;
}

uint8_t ne_read(void)
{
    GPIO_ReadInputDataBit(NE_PORT, NE_PIN);
    return 0;
}

uint8_t le_read(void)
{
    GPIO_ReadInputDataBit(LE_PORT, LE_PIN);
    return 0;
}

uint8_t buzzer_set(uint8_t val)
{
    if(val)
    {
        GPIO_SetBits(BUZZER_PORT,  BUZZER_PIN);
    }
    else
    {
        GPIO_ResetBits(BUZZER_PORT, BUZZER_PIN);
    }
    return 0;
}

